const path = require("path");
const fs = require("fs");
const { getFileName } = require("../utils/utils");
const { IMG_URL } = require("../config/index");
const UsersModel = require("../model/UsersModel");

module.exports = class CommonController {
  constructor() {
    // 对象属性
    // this.uploadsDirArr = [
    //  'uploads',
    //  'in_pic',
    //  'out_pic',
    //  'account_pic',
    //  'user_pic'
    // ]
    // this.usersModel = new usersModel();
  }

  // 静态属性 (在类体中定义)-类名直接调用
  // 上传目录分类（不同分类放不同的文件夹）:0 普通，1入库 2出库 3.经营记账 4.用户图像 5.食材图像
  static UPLOADS_DIR_ARR = [
    "uploads",
    "in_pic",
    "out_pic",
    "account_pic",
    "user_pic",
    "food_pic",
  ];

  /*
   * @desc 文件上传
   * @param pic 文件对象
   * @param dirType 上传目录分类（不同分类放不同的文件夹）：0 普通，1入库 2出库 3.经营记账 4.用户图像 5.食材图像
   * */
  static async uploadFile(req, res) {
    console.log("文件上传开始", req.files);
    const dirType = req.body.dirType;

    if (!req.files.pic || Object.keys(req.files).length === 0) {
      return res.status(400).send("没有选择文件，请选择文件");
    }

    console.log("文件上传开始2", req.files.pic);
    const file = req.files.pic; // 对应前端字段名,获取文件对象

    // 检查文件大小 (5MB限制)
    if (file.size > 5 * 1024 * 1024) {
      return res
        .status(400)
        .json({ code: 1, msg: "文件大小超过限制（最大5MB）" });
    }

    // 检查MIME类型
    const allowedImageTypes = [
      "image/jpeg",
      "image/jpg",
      "image/png",
      "image/gif",
      "image/bmp",
    ];
    if (!allowedImageTypes.includes(file.mimetype)) {
      return res
        .status(400)
        .json({
          code: 1,
          msg: "只允许上传图片文件 (jpg, jpeg, png, gif, bmp)",
        });
    }

    // 检查文件扩展名
    const allowedImageExtensions = /\.(jpg|jpeg|png|gif|bmp)$/i;
    if (!allowedImageExtensions.test(file.name)) {
      return res
        .status(400)
        .json({
          code: 1,
          msg: "只允许上传图片文件 (jpg, jpeg, png, gif, bmp)",
        });
    }

    // 生成唯一文件名以防止文件名冲突
    const fileName = getFileName();
    const fileExtension = path.extname(file.name);
    const uniqueFileName = `${fileName}${fileExtension}`;

    // 上传的图片存储到 文件夹
    const picDir = CommonController.UPLOADS_DIR_ARR[dirType];

    // 确保上传目录存在
    const uploadDir = path.join("public", picDir);
    if (!fs.existsSync(uploadDir)) {
      fs.mkdirSync(uploadDir, { recursive: true });
    }

    const uploadPath = path.join(uploadDir, uniqueFileName); //存储路径che
    const showPath = IMG_URL + picDir + "/" + uniqueFileName;

    console.log("文件路径", uploadPath);

    // 记录文件上传时间
    const startTime = new Date();
    console.log(`开始上传文件: ${uniqueFileName} at ${startTime}`);

    file.mv(uploadPath, (err) => {
      const endTime = new Date();
      const uploadDuration = (endTime - startTime) / 1000; // 转换为秒

      if (err) {
        console.error(`文件上传失败: ${uniqueFileName}, 错误:`, err);
        return res.status(500).send(err);
      }

      console.log(
        `文件上传成功: ${uniqueFileName}, 用时: ${uploadDuration}s, 大小: ${file.size} bytes`
      );

      res.json({
        message: "文件上传成功",
        file: {
          originalName: file.name,
          uploadName: uniqueFileName,
          path: showPath,
          size: file.size,
          uploadTime: startTime,
          uploadDuration: uploadDuration + "s",
          dirType: dirType, //目录分类
          dirName: picDir,
        },
        code: 0,
      });
    });
  }

  /*
   * @desc 获取上传的文件完整地址
   * @param fileName 文件名，格式：a.jpg
   * @param dirType 文件夹分类：0 普通，1入库 2出库 3.经营记账 4.用户图像 5.食材图像
   * @return 完整地址
   * */
  static async getUploadFileUrl(req, res) {
    const { fileName, dirType } = req.body;

    if (!fileName) {
      res.status(400).json({
        msg: "文件名称不能为空",
        code: -1,
      });
    }

    if (!dirType) {
      res.status(400).json({
        msg: "文件夹名称不能为空",
        code: -2,
      });
    }

    // 拼接文件路
    const picDir = CommonController.UPLOADS_DIR_ARR[dirType];
    const filePath = path.join("public", picDir, fileName);
    if (fs.existsSync(filePath)) {
      const result = {
        data: {
          url: IMG_URL + picDir + "/" + fileName,
          dirType: dirType,
          dirName: picDir,
        },
        code: 0,
        msg: "文件获取成功",
      };
      res.json(result);
    } else {
      res.status(404).json({
        msg: "文件不存在",
        code: 1,
      });
    }
  }

  /*
   * @desc 删除图片
   * @params fileName 文件名，格式：a.jpg
   * @params dirType 文件夹分类：0 普通，1入库 2出库 3.经营记账 4.用户图像 5.食材图像
   * @return
   * */
  // 参数：fileName 文件名，格式：a.jpg
  static delUploadPic(req, res) {
    const { fileName, dirType } = req.body;

    if (!fileName) {
      res.status(400).json({
        msg: "文件名称不能为空",
        code: -1,
      });
    }

    if (!dirType) {
      res.status(400).json({
        msg: "文件分类不能为空",
        code: -2,
      });
    }
    const picDir = CommonController.UPLOADS_DIR_ARR[dirType];

    const filePath = path.join("public", picDir, fileName);
    console.log("文件路径:", filePath);
    if (fs.existsSync(filePath)) {
      // 删除文件
      try {
        fs.unlinkSync(filePath);
        res.json({
          msg: "图片删除成功",
          code: 0,
          data: {
            fileName: fileName,
            dirType: dirType,
            dirName: picDir,
          },
        });
      } catch (e) {
        res.json({
          code: 1,
          msg: "图片删除失败:" + e.message,
        });
      }
    } else {
      res.status(404).json({
        msg: "图片不存在，请检查名称和分类是否正确",
        code: 1,
      });
    }
  }

  /*
   * @desc 根据用户角色获取用户列表，角色可以是多个
   * @params roleIds 角色ID列表，多个用逗号分隔
  * */
  static async getUserListByRoleIds(req, res) {
    try {
      const roleIds = req.query.roleIds;
      if (!roleIds){
        return res.status(400).json({
          msg: "请提供角色ID列表",
          code: -1,
        });
      }

      const usersModel = new UsersModel();
      const userList = await usersModel.getUsersByRoleId(roleIds);
      res.json({
        msg: "获取用户列表成功",
        code: 0,
        data: userList,
      });
    } catch (error) {
      res.status(500).json({
        msg: error.message,
        code: 1,
      });
    }
  }
};
